\documentclass[UTF8]{article} % 文档类：UTF8选项启用中文支持

% ---------- 宏包区域 ----------
\usepackage[UTF8]{ctex}       % 中文支持（必需）
\usepackage{amsmath}          % 高级数学公式
\usepackage{amssymb}           % 数学符号扩展
\usepackage{geometry}         % 页面布局控制
\usepackage{graphicx}         % 图片插入支持
\usepackage{hyperref}         % 超链接支持
\usepackage{listings}         % 代码块排版
\usepackage{xcolor}           % 颜色支持
\usepackage{booktabs}         % 专业表格线
\usepackage{tikz}             % 矢量绘图工具
\usepackage{array}             % 表格扩展支持
\usepackage{multirow}         % 表格跨行支持
\usepackage{ragged2e}         % 更好的文本对齐控制

% 页面边距设置（A4纸，上下左右各2.5cm）
\geometry{a4paper, left=2.5cm, right=2.5cm, top=2.5cm, bottom=2.5cm}

% 去除默认的目录红框
\hypersetup{
	colorlinks=true,
	linkcolor=black,
	filecolor=magenta,      
	urlcolor=cyan,
}

% TikZ绘图设置
\usetikzlibrary{calc, positioning, arrows.meta} % 加载必要的库
\tikzset{
	box/.style={
		draw, 
		rectangle, 
		minimum width=#1, 
		minimum height=1cm,
		align=center
	},
	arrow/.style={
		->, 
		>=stealth, 
		thick
	},
	component/.style={
		draw,
		rectangle,
		minimum width=2.5cm,
		minimum height=1.2cm,
		align=center,
		font=\small
	}
}

% 代码块样式设置
\lstset{
	basicstyle=\ttfamily\small, % 基本样式
	keywordstyle=\color{blue},   % 关键词蓝色
	commentstyle=\color{green!50!black}, % 注释绿色
	stringstyle=\color{orange},  % 字符串橙色
	frame=single,                % 单线边框
	breaklines=true,             % 允许断行
	postbreak=\mbox{\textcolor{red}{$\hookrightarrow$}\space}, % 换行标识
}

% 文档元信息
\title{\textbf{STM32 嵌入式系统笔记}}
\author{SoloZhou}
\date{2025/08/19}

% 文档正文开始
\begin{document}
	
	\maketitle	 	  % 生成标题页
	\tableofcontents  % 生成目录
	\newpage		  % 新页面开始
	
	% ==== 1. STM32命名规则 ====
	\section{STM32 命名规则}
	\subsection{型号解码}
	STM32 型号命名格式：\textbf{STM32 F 407 Z G T 6}
	
	% 命名规则表格
	\begin{table}[ht] % [ht] = "这里" + "顶部"
		\centering % 居中
		\caption{STM32 型号命名规则} % 表标题
		\label{tab:STM32naming} % 引用标签
		
		\begin{tabular}{>{\RaggedRight}m{2cm}m{8cm}} 
			\toprule % 顶部横线
			\textbf{代码} & \textbf{含义} \\
			\midrule % 中部横线
			STM32 & STMicroelectronics 32位MCU \\
			F & 基础型 \\
			G & 主流型 \\
			H & 高性能 \\
			A & 车载级 \\
			407 & 高性能系列 \\
			103 & 基础系列 \\
			Z & 144引脚 \\
			V & 100引脚 \\			
			T & LQFP封装 \\	
			6 & 温度范围（-40°C ~ 85°C） \\
			\bottomrule % 底部横线
		\end{tabular}
	\end{table}
	
% ==== 2. 处理器架构 ====
\section{处理器架构} % 一级章节
\subsection{冯诺依曼架构 vs 哈佛架构} % 二级章节

% 公共组件列表	
\begin{itemize}
	\item \textbf{共同组件}：
	\begin{itemize}
		\item 存储器（Memory）
		\item 控制器（Control Unit）
		\item 程序计数器（Program Counter）
		\item 运算器（ALU）
		\item 指令寄存器（Instruction Register）
		\item 数据寄存器（Data Register）
	\end{itemize}
	
	% 冯诺依曼架构
	\item \textbf{冯诺依曼架构}：
	\begin{itemize}
		\item 指令和数据共享同一存储空间
		\item 取指令和取数据共用一条总线
		\item 存在\underline{“冯诺依曼瓶颈”}
	\end{itemize}
	
	% 哈佛架构
	\item \textbf{哈佛架构}：
	\begin{itemize}
		\item 指令存储和数据存储物理分离
		\item 取指令和数据使用不同的总线
		\item 典型代表：ARM Cortex-M系列（如STM32）
	\end{itemize}
\end{itemize}

% 架构对比表格
\begin{table}[ht] % [ht] = "这里" + "顶部"
	\centering % 居中
	\caption{冯诺依曼架构与哈佛架构对比} % 表标题
	\label{tab:vonNeumannHarvard} % 引用标签
	
	\begin{tabular}{>{\raggedright\arraybackslash}p{3cm}>{\raggedright\arraybackslash}p{6cm}>{\raggedright\arraybackslash}p{6cm}}
		\toprule % 顶部横线
		\textbf{特性} & \textbf{冯诺依曼架构} & \textbf{哈佛架构} \\
		\midrule % 中部横线
		\textbf{存储器结构} & 
		指令和数据共享同一存储空间 &
		指令存储器和数据存储器物理分离 \\
		
		\textbf{总线结构} & 
		单一总线（指令和数据共用） & 
		双独立总线（指令总线和数据总线） \\
		
		\textbf{执行效率} & 
		顺序执行，存在"冯诺依曼瓶颈" & 
		并行执行，更高效率 \\
		
		\textbf{典型应用} & 
		通用计算机（PC、服务器） & 
		嵌入式系统（STM32）、DSP \\
		
		\textbf{复杂度} & 
		相对简单 & 
		相对复杂 \\
		
		\textbf{成本} & 
		较低 & 
		较高 \\
		
		\textbf{安全性} & 
		指令和数据混存，易受攻击 & 
		指令和数据分离，安全性更高 \\
		
		\textbf{实时性} & 
		一般 & 
		优秀 \\
		
		\textbf{代表产品} & 
		Intel x86系列处理器 & 
		ARM Cortex-M系列微控制器 \\
		
		\bottomrule % 底部横线
	\end{tabular}
\end{table}
	
	% 架构对比图
	\begin{figure}[ht] % [ht] = "这里" + "顶部"
		\centering % 居中
		\begin{tikzpicture}[scale=1.1, transform shape] % 整体缩放
			
			% ===== 冯诺依曼架构 =====
			% 存储器框
			\node[draw, rectangle, minimum width=3cm, minimum height=2cm] (mem) at (0,0) {存储器};
			
			% CPU框
			\node[draw, rectangle, minimum width=2cm, minimum height=1.5cm] (cpu) at (4,0) {CPU};
			
			% 连接线
			\draw[->, thick] (mem.east) to[out=0, in=180] ($(cpu.west)+(0,0.3)$);
			\draw[->, thick] (cpu.west) to[out=180, in=0] ($(mem.east)+(0,-0.3)$);
			
			% 标签 - 居中显示在架构下方
			\node[text width=4cm, align=center, below=1.5cm of mem] (vonlabel) {冯诺依曼架构\\共享总线};
			
			% 连接标签
			\node[above, font=\small] at ($(mem.east)!0.5!(cpu.west)+(0,0.5)$) {读操作};
			\node[below, font=\small] at ($(mem.east)!0.5!(cpu.west)+(0,-0.5)$) {写操作};
			
			% ===== 哈佛架构 =====
			\begin{scope}[xshift=7cm]
				% 指令存储器
				\node[draw, rectangle, minimum width=1.5cm, minimum height=2cm, align=center] (imem) at (0,1.5) {指令\\存储器};
				
				% 数据存储器
				\node[draw, rectangle, minimum width=1.5cm, minimum height=2cm, align=center] (dmem) at (0,-1.5) {数据\\存储器};
				
				% CPU - 向右移动避免重叠
				\node[draw, rectangle, minimum width=2cm, minimum height=2cm] (cpu2) at (4,0) {CPU};
				
				% CPU与存储器的连接箭头 - 简化连接线
				\draw[->, thick] (cpu2.west) -- ++(-0.5,0) |- (imem);
				\draw[->, thick] (cpu2.west) -- ++(-0.5,0) |- (dmem);
				
				% 标签 - 居中显示在架构下方
				\node[text width=4cm, align=center, below=0.5cm of dmem] (harvardlabel) {哈佛架构\\独立总线};
				
				% 连接标签
				\node[above, font=\small] at ($(imem.east)!0.5!(cpu2.west)+(0,0.5)$) {指令};
				\node[below, font=\small] at ($(dmem.east)!0.5!(cpu2.west)+(0,-0.5)$) {数据};
			\end{scope}
		\end{tikzpicture}
		\caption{处理器架构对比} % 图标题
		\label{fig:arch} % 引用标签
	\end{figure}	
	
	% ==== 冯诺依曼架构工作流程 ====
	\subsection{冯诺依曼架构工作流程}
	\begin{figure}[ht]
		\centering
		\begin{tikzpicture}[
			>=Stealth,
			node distance=1.5cm and 1.2cm,
			component/.style={draw, rectangle, minimum width=2.5cm, minimum height=1.2cm, align=center, font=\small},
			register/.style={draw, rectangle, minimum width=2cm, minimum height=1cm, align=center, font=\footnotesize},
			arrow/.style={->, thick},
			dataflow/.style={arrow, blue},
			controlflow/.style={arrow, red, dashed}
			]
			
			% 主要组件
			\node[component, fill=yellow!20] (memory) {存储器 (Memory)};
			\node[component, fill=green!20, below=of memory] (cu) {控制器 (Control Unit)};
			\node[component, fill=orange!20, right=of cu] (alu) {运算器 (ALU)};
			
			% 寄存器
			\node[register, fill=cyan!20, above left=0.5cm and -1.5cm of cu] (pc) {程序计数器 (Program Counter)};
			\node[register, fill=cyan!20, above right=0.5cm and -1.5cm of cu] (ir) {指令寄存器 (Instruction Register)};
			\node[register, fill=cyan!20, below=0.5cm of alu] (dr) {数据寄存器 (Data Register)};
			
			% 数据流
			\draw[dataflow] (pc) -- node[midway, left] {地址} (memory.west |- pc);
			\draw[dataflow] (memory.south -| ir) -- node[midway, right] {指令} (ir);
			\draw[dataflow] (ir) -- node[midway, left] {操作码} (cu);
			\draw[dataflow] (cu) -- node[midway, above] {操作指令} (alu);
			\draw[dataflow] (memory.south -| dr) -- node[midway, right] {数据} (dr);
			\draw[dataflow] (dr) -- (memory.south -| dr);
			\draw[dataflow] (dr) -- node[midway, right] {操作数} (alu);
			\draw[dataflow] (alu) -- node[midway, left] {结果} (dr);
			
			% 控制流
			\draw[controlflow] (cu) -- node[midway, left] {更新指令} (pc);
			\draw[controlflow] (cu) -- node[midway, right] {加载指令} (ir);
			\draw[controlflow] (cu.north) -- ++(0,0.5) -| node[pos=0.25, above] {读/写控制} (memory.south);
			\draw[controlflow] (cu) -- ++(1.5,0) |- node[pos=0.25, right] {数据控制} (dr);
			
			% 工作流程标注
			\node[draw, fill=white, rounded corners, align=left, font=\scriptsize, above=0.5cm of memory] {
				\textbf{工作流程}: \\
				1. PC提供指令地址 \\
				2. 存储器返回指令到IR \\
				3. CU解码指令 \\
				4. CU控制ALU执行操作 \\
				5. 结果存储到DR \\
				6. PC更新指向下一条指令
			};
		\end{tikzpicture}
		\caption{冯诺依曼架构核心部件工作流程}
		\label{fig:von_neumann_workflow}
	\end{figure}
	
	% ==== 3. 中断系统 ====
	\section{中断系统}
	\subsection{软中断机制}
	\begin{itemize}
		\item \textbf{定义}：在硬件中断处理程序中触发的次级中断
		
		\item \textbf{工作流程}：
		\begin{enumerate}
			\item 硬件中断触发（如外设事件）
			\item 执行对应的硬件中断处理函数（ISR）
			\item ISR中调用软件触发函数产生软中断
			\item 软中断服务程序（Callback）被执行
		\end{enumerate}
		
		\item \textbf{优先级规则}：
		\begin{itemize}
			\item 当硬件中断优先级 > 软中断：先完整执行硬件ISR，再执行软中断Callback
			\item 当硬件中断优先级 < 软中断：硬件ISR被软中断抢占
			\item 同优先级时按自然顺序执行
		\end{itemize}
	\end{itemize}
	
	% 软中断代码示例
	\begin{lstlisting}[language=C, caption=软中断示例代码]
		// 硬件中断处理函数
		void TIM3_IRQHandler(void) {
			if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) {
				// 触发软中断
				NVIC_SetPendingIRQ(Software_IRQn);
				TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
			}
		}
		
		// 软中断服务程序
		void SoftwareIRQ_Handler(void) {
			// 执行软中断处理任务
			DoAsyncProcessing();
		}
	\end{lstlisting}
	
	% ==== 4. 时钟系统 ====
	\section{时钟系统}
	\subsection{时钟源类型}
	STM32包含5个独立的时钟源：
	
	% 时钟源表格
	\begin{table}[ht] % [ht] = "这里" + "顶部"
		\centering % 居中
		\caption{STM32时钟源} % 表标题
		\label{tab:clocks} % 引用标签
		\begin{tabular}{lll>{\raggedright\arraybackslash}p{7cm}} % 列格式（最后列右对齐）
			\toprule % 顶部横线
			\textbf{简称} & \textbf{名称} & \textbf{频率} & \textbf{用途} \\
			\midrule % 中部横线
			HSI & 高速内部时钟 & 8MHz & RC振荡器，系统时钟备份源 \\
			HSE & 高速外部时钟 & 4-16MHz & 外部晶振，主系统时钟源 \\
			LSI & 低速内部时钟 & 40kHz & RC振荡器，独立看门狗时钟源 \\
			LSE & 低速外部时钟 & 32.768kHz & 外部晶振，RTC实时时钟源 \\
			PLL & 锁相环倍频器 & 2-16倍 & 主时钟倍频输出 \\
			\bottomrule % 底部横线
		\end{tabular}
	\end{table}
	
	\subsection{总线连接设备}
	\begin{itemize}
		\item \textbf{APB1（低速外设总线，最高36MHz）}：
		\begin{itemize}
			\item 电源接口（PWR）
			\item 备份寄存器（BKP）
			\item CAN总线接口
			\item USB设备接口
			\item I²C1, I²C2
			\item UART2, UART3
			\item SPI2
			\item 窗口看门狗（WWDG）
			\item 定时器（TIM2, TIM3, TIM4）
		\end{itemize}
		
		\item \textbf{APB2（高速外设总线，最高72MHz）}：
		\begin{itemize}
			\item 高级定时器（TIM1）
			\item SPI1
			\item UART1
			\item ADC1, ADC2
			\item 所有GPIO端口（PA-PE）
			\item 第二功能IO口（AFIO）
		\end{itemize}
		
		\item \textbf{特殊说明}：
		\begin{itemize}
			\item USB模块需要单独的48MHz时钟（由PLL提供）
			\item 系统时钟通过AHB总线分频到APB总线
			\item RCC\_CR寄存器HSERDY位指示HSE状态：1=时钟就绪，0=时钟未稳定
		\end{itemize}
	\end{itemize}
	
	% 时钟树示意图
	\begin{figure}[ht] % [ht] = "这里" + "顶部"
		\centering % 居中
		% 占位框 - 实际使用时可替换为真实图片
		\framebox[\textwidth]{% 带边框
			\parbox{0.9\textwidth}{% 宽90%
				\centering % 内容居中
				\vspace{2cm} % 上边距
				\textbf{STM32时钟树结构示意图} \\ % 标题
				\vspace{1cm} % 间距
				\small（此位置可替换为时钟树图） % 提示
				\vspace{2cm} % 下边距
			}
		}
		\caption{STM32时钟树结构} % 图标题
		\label{fig:clock_tree} % 引用标签
	\end{figure}
	
	% ==== 重点总结 ====
	\section*{重点总结} % 星号 = 非编号章节
	\begin{itemize}
		\item \textbf{哈佛架构}：指令与数据分离存储和处理，提高执行效率
		\item \textbf{STM32命名}：型号中字母/数字表示性能、引脚数和温度范围
		\item \textbf{软中断}：在ISR中触发的次级中断，优先级规则决定执行顺序
		\item \textbf{时钟系统}：5个时钟源各司其职，注意HSERDY指示HSE状态
		\item \textbf{外设总线}：低速设备接APB1（<36MHz），高速设备接APB2（<72MHz）
	\end{itemize}
	
\end{document} % 文档结束